function CAcode = generateCAcode(PRN)
// generateCAcode.m generates one of the 32 GPS satellite C/A codes.
//
// CAcode = generateCAcode(PRN)
//
//   Inputs:
//       PRN         - PRN number of the sequence.
//
//   Outputs:
//       CAcode      - a vector containing the desired C/A code sequence 
//                   (chips).  

//--------------------------------------------------------------------------
//                           SoftGNSS v3.0
// 
// Copyright (C) Darius Plausinaitis
// Written by Darius Plausinaitis
// Based on Dennis M. Akos, Peter Rinder and Nicolaj Bertelsen
// Updated and converted to scilab 5.3.0 by Artyom Gavrilov
//--------------------------------------------------------------------------
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
//USA.
//--------------------------------------------------------------------------

  if PRN < 100 then

    //--- Make the code shift array. The shift depends on the PRN number -------
    // The g2s vector holds the appropriate shift of the g2 code to generate
    // the C/A code (ex. for SV#19 - use a G2 shift of g2s(19) = 471)
    g2s = [  5,   6,   7,   8,  17,  18, 139, 140, 141, 251, ...
           252, 254, 255, 256, 257, 258, 469, 470, 471, 472, ...
           473, 474, 509, 512, 513, 514, 515, 516, 859, 860, ...
           861, 862, 145, 175,  52,  21, 237, 235, 886, 657, ...
           634, 762, 355, 1012, 176, 603, 130, 359, 595, 68, ...
           386];

    //--- Pick right shift for the given PRN number ----------------------------
    g2shift = g2s(PRN);

    //--- Generate G1 code -----------------------------------------------------

    //--- Initialize g1 output to speed up the function ---
    g1 = zeros(1, 1023);
    //--- Load shift register ---
    reg = -1*ones(1, 10);

    //--- Generate all G1 signal chips based on the G1 feedback polynomial -----
    for i=1:1023
      g1(i)       = reg(10);
      saveBit     = reg(3)*reg(10);
      reg(2:10)   = reg(1:9);
      reg(1)      = saveBit;
    end

    //--- Generate G2 code -----------------------------------------------------

    //--- Initialize g2 output to speed up the function ---
    g2 = zeros(1, 1023);
    //--- Load shift register ---
    reg = -1*ones(1, 10);

    //--- Generate all G2 signal chips based on the G2 feedback polynomial -----
    for i=1:1023
      g2(i)       = reg(10);
      saveBit     = reg(2)*reg(3)*reg(6)*reg(8)*reg(9)*reg(10);
      reg(2:10)   = reg(1:9);
      reg(1)      = saveBit;
    end
  
    //--- Shift G2 code --------------------------------------------------------
    //The idea: g2 = concatenate[ g2_right_part, g2_left_part ];
    g2 = [g2(1023-g2shift+1 : 1023), g2(1 : 1023-g2shift)];

    //--- Form single sample C/A code by multiplying G1 and G2 -----------------
    CAcode = -(g1 .* g2);

  else
    if PRN == 101  then //PRN=101 - GLONASS PRN code generation.
      reg = -1*ones(1,9);
      for i=1:511
        g3(i)=reg(7);
        msave=reg(5)*reg(9);
        reg(2:9)=reg(1:8);
        reg(1)=msave;
      end;
      CAcode=-g3'; 
    end
  end

endfunction
